package cz.stv.pecinovsky.město;
import cz.stv.pecinovsky.správceplátna.IOvládaný;
import cz.stv.pecinovsky.správceplátna.Kreslítko;
import cz.stv.pecinovsky.správceplátna.Řadič;
import cz.stv.pecinovsky.správceplátna.SprávcePlátna;

import cz.stv.pecinovsky.utility.IO;
import cz.stv.pecinovsky.utility.Pozice;
import cz.stv.pecinovsky.utility.Směr8;


/*******************************************************************************
 * Instance třídy {@code Vozidlo_A} představují "pojízdné" objekty,
 * které je možné ovládat z klávesnice.
 *
 * @author  Rudolf PECINOVSKÝ
 * @version 1.10.2678 — 2011-10-27
 */
public class Vozidlo_A implements IOvládaný
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================

    /** Plátno, na které se bude instance kreslit. */
    private static final SprávcePlátna SP = SprávcePlátna.getInstance();



//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================

    /** Rychlost pohybu, tj. o kolik bodů se objekt posune po jednom příkazu. */
    private int rychlost = SP.getKrok();



//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    /** Dekorovaný objekt, který bude ovládán z klávesnice. */
    private final IOtočný dekorovaný;



//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Obalí otočný objekt zadaný v parametru schopností býti ovládán
     * z klávesnice.
     *
     * @param ovládaný Dekorovaný objekt
     */
    public Vozidlo_A(IOtočný ovládaný)
    {
        this.dekorovaný = ovládaný;
    }



//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Reakce na stisk klávesy se šipkou vpravo.
     */
    @Override
    public void vpravo()
    {
        Směr8 směr = dekorovaný.getSměr();
        dekorovaný.setSměr(směr.vpravoVbok());
    }


    /***************************************************************************
     * Reakce na stisk klávesy se šipkou vlevo.
     */
    @Override
    public void vlevo()
    {
        Směr8 směr = dekorovaný.getSměr();
        dekorovaný.setSměr(směr.vlevoVbok());
    }


    /***************************************************************************
     * Reakce na stisk klávesy se šipkou vzhůru.
     */
    @Override
    public void vzhůru()
    {
        Pozice pozice = dekorovaný.getPozice();
        Směr8  směr   = dekorovaný.getSměr();
        pozice = směr.dalšíPozice(pozice, rychlost);
        dekorovaný.setPozice(pozice);
    }


    /***************************************************************************
     * Reakce na stisk klávesy se šipkou dolů.
     */
    @Override
    public void dolů()
    {
    }


    /***************************************************************************
     * Reakce na stisk klávesy enter.
     */
    @Override
    public void enter()
    {
    }


    /***************************************************************************
     * Reakce na stisk mezerníku.
     */
    @Override
    public void mezera()
    {
    }


    /***************************************************************************
     * Reakce na stisk klávesy ESC, tj. na ukončení ovládání z klávesnice.
     */
    @Override
    public void konec()
    {

    }


    /***************************************************************************
     * Vrátí řetězec sloužící jako textový "podpis" instance
     * používaný především při ladění.
     *
     * @param kreslítko Kreslítko, které nakreslí instanci
     */
    @Override
    public void nakresli(Kreslítko kreslítko)
    {
        dekorovaný.nakresli(kreslítko);
    }


    /***************************************************************************
     * Vrací textovou reprezentaci (podpis) dané instance
     * používanou především k ladicím účelům.
     *
     * @return Požadovaná textová reprezentace
     */
    @Override
    public String toString()
    {
        return "Voziclo_A_(" + dekorovaný.toString() + ")";
    }



//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTY A METODA MAIN =======================================================

    /***************************************************************************
     * Testovací metoda.
     */
    public static void test()
    {
        Šipka šipka  = new Šipka();
        Vozidlo_A va = new Vozidlo_A(šipka);
        Řadič řadič  = new Řadič(va);

        IO.zpráva("Až se projedeš, stiskni OK");
        System.exit(0);
    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}

